﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Reflection;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Types;
using System.Xml;

namespace Framework.Constructor.Sql
{
    public class TipoDeDato : ObjetoBase
    {
        public System.Type TipoSql { get; set; }
        public System.Type TipoNet { get; set; }
        public Int32 System_Type_Id { get { return this.Id; } set { this.Id = value; } }
        public TipoDeDato( Dictionary<String, Object> diccionario )
            : base( diccionario )
        {
            this.ObtenerTipos();
        }
        public void ObtenerTipos()
        {
            switch ( this.Name.ToLowerInvariant() )
            {
                case "bigint":
                    this.TipoSql = typeof( SqlInt64 );
                    this.TipoNet = typeof( Int64 );
                    break;
                case "binary":
                    this.TipoSql = typeof( SqlBytes );
                    this.TipoSql = typeof( SqlBinary );
                    this.TipoNet = typeof( Byte[] );
                    break;
                case "bit":
                    this.TipoSql = typeof( SqlBoolean );
                    this.TipoNet = typeof( Boolean );
                    break;
                case "char":
                    this.TipoSql = typeof(SqlChars[]);
                    this.TipoNet = typeof(String);
                    break;
                case "cursor":
                    this.TipoSql = null;
                    this.TipoNet = null;
                    break;
                case "date":
                    this.TipoSql = typeof( SqlDateTime );
                    this.TipoNet = typeof( DateTime );
                    break;
                case "datetime":
                    this.TipoSql = typeof( SqlDateTime );
                    this.TipoNet = typeof( DateTime );
                    break;
                case "datetime2":
                    this.TipoSql = typeof( SqlDateTime );
                    this.TipoNet = typeof( DateTime );
                    break;
                case "DATETIMEOFFSET":
                    this.TipoSql = null;
                    this.TipoNet = typeof( DateTimeOffset );
                    break;
                case "decimal":
                    this.TipoSql = typeof( SqlDecimal );
                    this.TipoNet = typeof( Decimal );
                    break;
                case "float":
                    this.TipoSql = typeof( SqlDouble );
                    this.TipoNet = typeof( Double );
                    break;
                case "geography":
                    this.TipoSql = typeof( SqlGeography );
                    this.TipoNet = typeof( SqlGeography );
                    break;
                case "geometry":
                    this.TipoSql = typeof( SqlGeometry );
                    this.TipoNet = typeof( SqlGeometry );
                    break;
                case "hierarchyid":
                    this.TipoSql = typeof( SqlHierarchyId );
                    this.TipoNet = typeof( SqlHierarchyId );
                    break;
                case "image":
                    this.TipoSql = typeof( SqlBytes );
                    this.TipoSql = typeof( SqlBinary );
                    this.TipoNet = typeof( Byte[] );
                    break;
                case "int":
                    this.TipoSql = typeof( SqlInt32 );
                    this.TipoNet = typeof( Int32 );
                    break;
                case "money":
                    this.TipoSql = typeof( SqlMoney );
                    this.TipoNet = typeof( Decimal );
                    break;
                case "nchar":
                    this.TipoSql = typeof( SqlChars );
                    this.TipoSql = typeof( SqlString );
                    this.TipoNet = typeof( String );
                    break;
                case "ntext":
                    this.TipoSql = null;
                    this.TipoNet = typeof( String );
                    break;
                case "numeric":
                    this.TipoSql = typeof( SqlDecimal );
                    this.TipoNet = typeof( Decimal );
                    break;
                case "nvarchar":
                    this.TipoSql = typeof( SqlChars );
                    this.TipoSql = typeof( SqlString );
                    this.TipoNet = typeof( String );
                    break;
                case "real":
                    this.TipoSql = typeof( SqlSingle );
                    this.TipoNet = typeof( Single );
                    break;
                case "smalldatetime":
                    this.TipoSql = typeof( SqlDateTime );
                    this.TipoNet = typeof( DateTime );
                    break;
                case "smallint":
                    this.TipoSql = typeof( SqlInt16 );
                    this.TipoNet = typeof( Int16 );
                    break;
                case "smallmoney":
                    this.TipoSql = typeof( SqlMoney );
                    this.TipoNet = typeof( Decimal );
                    break;
                case "sql_variant":
                    this.TipoSql = null;
                    this.TipoNet = typeof (Object);
                    break;
                case "sysname":
                    this.TipoSql = null;
                    this.TipoNet = null;
                    break;
                case "text":
                    this.TipoSql = typeof( SqlString );
                    this.TipoNet = typeof( String );
                    break;
                case "time":
                    this.TipoSql = null;
                    this.TipoNet = typeof( TimeSpan );
                    break;
                case "tinyint":
                    this.TipoSql= typeof (SqlByte);
                    this.TipoNet = typeof(Byte);
                    break;
                case "uniqueidentifier":
                    this.TipoSql= typeof (SqlGuid);
                    this.TipoNet = typeof(Guid);
                    break;
                case "varbinary":
                    this.TipoSql= typeof (SqlBytes);
                    this.TipoNet = typeof(Byte[]);
                    break;
                case "varchar":
                    this.TipoSql = typeof( SqlString );
                    this.TipoNet = typeof( String );
                    break;
                case "xml":
                    this.TipoSql= typeof (SqlXml);
                    this.TipoNet = typeof(XmlDocument);
                    break;
                default:
                    this.TipoSql = null;
                    this.TipoNet = null;
                    break;
            }
        }
    }
}
